package cn.gok.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
   基于注解的方式实现Spring AOP

        @Component ：将当前切面纳入Spring管理
        @Aspect： 标记当前类为一个切面类
 */
@Component
@Aspect
public class MyAspect {

    /**
     * @Pointcut 将重复的切入点规则抽取处理，实现复用
     */
    @Pointcut("execution(* cn.gok.service.impl.*.*(..))")
    public void pointCut(){}


    @Before("execution(* cn.gok.service.impl.UserServiceImpl.addUser())")
    public void action(){
        System.out.println("参数检查。。。");
    }

    /**
     * 直接书写方法名，进行切入点规则的复用
     */
    @After("pointCut()")
    public void actionLog(){
        System.out.println("记录日志。。。");
    }


    @AfterThrowing("pointCut()")
    public void actionException(){
        System.out.println("异常处理。。。");
    }


    @Around("execution(* cn.gok.service.impl.UserServiceImpl.getUserInfo(int))")
    public void around(ProceedingJoinPoint pj){
        System.out.println("环绕前的代码");

        try {
            Object proceed = pj.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
        }


        System.out.println("环绕后的代码");
    }
}
